﻿using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text.RegularExpressions;
using System.Linq;
using System.Diagnostics;
using ZstdSharp.Unsafe;

namespace CSUnitTest
{
    [TestClass]
    public class variable_study
    {
        //变量类型,运算符
        [TestMethod]
        public void TestMethod1()
        {
            int a = 1;
            long b = 2;
            float f = 3;
            double g = 4;
            decimal c = 4;
            bool d = false;

            //常亮定义
            const double PI = 3.1415926;

            //运算符
            //++  --
            a++;
            b--;
            //Console.WriteLine(a);
            //Assert.AreEqual(a, b);
            //Console.WriteLine(a == b);

            //is
            //Console.WriteLine(a is int);
            //? : 
            //Console.WriteLine(a != b ? "ok" : "no");

            //typeof
            //Console.WriteLine(typeof (int));
        }
    }

    [TestClass]
    public class string_study
    {
        //字符和字符串
        [TestMethod]
        public void TestMethod2()
        {
            //Char类变量必须包含在一对单引号之内，如's'、'1'。
            char[] a = { 'a', 'b' };
            Console.WriteLine(a);

            //转义字符
            //转义字符是一种特殊的字符变量，它以反斜线“\”开头，后跟一个或多个字符。
            //转义字符通常具有特定的含义，不再表示字符的原义。例如，“\n”不再表示字符n，而是表示
            //按回车键换行这一操作。总之，使用转义字符，可将字符转换成其他操作指令，或是将无法一
            //起使用的字符进行组合。
            char b = '\'';
            char c = '\"';
            Console.WriteLine(b);
            Console.WriteLine(c);

            //字符串
            //字符串必须包含在一对双引号之内。
            //'s'表示字符s，"s"则表示一个字符串，该字符串只有一个字符。
            string pome = "何须浅碧深红色，自是花中第一流。";
            Console.WriteLine(pome);

            //字符串的比较
            //==  对两个字符串的值进行逐一比较
            string str1 = "mingrikeji";
            string str2 = "mingrikeji";
            Console.WriteLine((str1 == str2));
            //String.Compare()方法是一个静态方法，使用时可以直接引用。
            String.Compare(str1, str2);
            //CompareTo()
            str1.CompareTo(str2);
            //Equals
            str1.Equals(str2);
            String.Equals(str1, str2);

            //String类提供了一个静态Format()方法，用于将字符串数据（数值型数据和日期时间型数据）格式化为指定格式。
            //     public static string Format(string format, object obj);
            DateTime dateTime = DateTime.Now;
            Console.WriteLine(dateTime.ToString());
            string time = String.Format("{0:D}", dateTime);
            Console.WriteLine(time);

            string general1 = "飞将军李广";
            string general2 = "大将军卫青";
            string general3 = "骠骑将军霍去病";
            string msg = string.Format("武帝朝有名将{0},{1},{2}", general1, general2, general3);
            Console.WriteLine(msg);


            //字符串截取
            string pomeSub = pome.Substring(1, 13);
            //Console.WriteLine(pomeSub);

            //根据分隔符分割字符串
            string pome2 = "何须浅碧深红色，自是花中第一流。几番展转盘花扇，暂倚斜阳马上头。须信主人帘外雨，丁香结子蜂纷纷。黄昏散步杨花落，青帘独倚望乡门。";
            string[] spome = pome2.Split('。');
            foreach (string s in spome)
            {
                Console.WriteLine(s);
            }

            //替换
            string pome3 = pome2.Replace('。', '%');
            //Console.WriteLine(pome3);

            //正则

        }

        //正则
        [TestMethod]
        public void TestMethod3()
        {
            string input = "Hello, 12345 World!";
            string pattern = @"\d+";
            Match match = Regex.Match(input, pattern);
            if (match.Success)
            {
                Console.WriteLine("Match found: " + match.Value);
            }

            string input2 = "Hello, 12345 World! 67890";
            string pattern2 = @"\d+";
            MatchCollection matches = Regex.Matches(input2, pattern2);
            foreach (Match match2 in matches)
            {
                Console.WriteLine("Match found: " + match2.Value);
            }
        }
    }


    [TestClass]
    public class list_study
    {
        //数组和集合
        [TestMethod]
        public void TestMethod1()
        {

            //数组定义
            string[] arr = new string[5];
            int[] arr2 = new int[] { 1, 2, 14, 73, 24, 66, 3, 5, 54 };
            string[] arr3 = new string[] { "卓文君", "司马相如", "卓王孙", "成都", "家徒四壁" };


            //数组遍历
            //Console.WriteLine(arr2[1]);
            //foreach (int i in arr2)
            //{
            //    Console.WriteLine(i);
            //}

            //排序，反转
            Array.Sort(arr2);
            Array.Reverse(arr3);
            foreach (string i in arr3)
            {
                Console.WriteLine(i);
            }
            foreach (int i in arr2)
            {
                Console.WriteLine(i);
            }
        }

        //集合
        [TestMethod]
        public void TestMethod2()
        {
            //ArrayList
            int[] arr2 = new int[] { 1, 2, 14, 73, 24, 66, 3, 5, 54 };
            ArrayList arrayList = new ArrayList(arr2);
            arrayList.Add(100);
            bool b = arrayList.Contains(100);
            Console.WriteLine(b);


            //哈希表Hashtable
            Hashtable ht = new Hashtable();
            //新增     public virtual void Add(Object key,Object value)
            ht.Add("id", "99999");
            ht.Add("gender", "男");
            ht.Add("age", "22");
            foreach (DictionaryEntry dictionaryEntry in ht)
            {
                Console.WriteLine(dictionaryEntry.Key + ":::::" + dictionaryEntry.Value);
            }

            //删除        public virtual void Remove(Object key)

            //查找
            //     public virtual bool Contains(Object key)是否包含特定键
            //     public virtual bool ContainsValue(Object value)是否包含特定值
            //ContainsKey()方法和Contains()方法实现的功能、语法都相同
            Console.WriteLine(ht.Contains("id"));
            Console.WriteLine(ht.ContainsValue("222"));


            //字典
            //Dictionary 是 Hashtable 的泛型替代品，提供了更好的类型安全和性能。
            //在新的代码开发中，通常推荐使用 Dictionary。
            Dictionary<string, DateTime> dir = new Dictionary<string, DateTime>();
            dir.Add("t1", DateTime.Parse("2030-11-24"));
            //dir.Add("t2", null);
            DateTime sevedTime;
            if (dir.TryGetValue("t1", out sevedTime))
            {
                Console.WriteLine(sevedTime.ToString());
            }
        }

        [TestMethod]
        public void TestMethod3()
        {
            Dictionary<string, DateTime> dic = new Dictionary<string, DateTime>();
            string key1 = "4543";
            DateTime val1 = DateTime.Today ;
            dic.Add(key1,val1);
        }
    }


    [TestClass]
    public class linq_study
    {
        //Lambda表达式
        [TestMethod]
        public void TestMethod3()
        {
            Func<int, int> Square = x => x * x;
            Console.WriteLine($"输出：{Square(10)}");
            //输出：100


            List<int> list = new List<int> { 2, 89, 46, 8, 57, 66, 49, 32, 21, 23, 67, 106, 200, 159, 153, 122, 146, 188 };
            //使用 Where 过滤集合中的元素：
            var r1 = list.Where(x => x % 2 == 0);
            //使用 Select 对集合中的元素进行转换：
            var r2 = list.Select(x => x / 2 + 100);
            //使用 OrderBy 对集合中的元素进行排序：
            var r3 = list.OrderBy(x => x);
            //使用 Any 判断集合中是否存在满足条件的元素：
            var r4 = list.Any(x => x % 7 == 0);
            //使用 First 获取集合中满足条件的第一个元素：
            var r5 = list.First(x => x % 8 == 0);
            //使用 Sum 计算集合中元素的总和：
            var r6 = list.Sum();
            Console.WriteLine(r1);
            Console.WriteLine(r2);
            Console.WriteLine(r3);
            Console.WriteLine(r4);
            Console.WriteLine(r5);
            Console.WriteLine(r6);
        }

        //LINQ
        [TestMethod]
        public void TestMethod4()
        {
            int[] numbers = { 2, 5, 28, 31, 17, 16, 42 };

            var numsQuery = from n in numbers where n < 20 select n;  //查询语法

            var numsMethod = numbers.Where(x => x < 20);  //方法语法

            int numsCount = (from n in numbers where n < 20 select n).Count();  //俩种方法的组合

            foreach (var x in numsQuery)
                Console.WriteLine(x);

            foreach (var x in numsMethod)
                Console.WriteLine(x);

            Console.WriteLine(numsCount);
        }
    }

    [TestClass]
    public class datetime_study
    {
        //日期时间
        [TestMethod]
        public void TestMethod5()
        {
            //获取系统时间
            DateTime dt = DateTime.Now;
            DateTime today = DateTime.Today;
            DateTime date1 = new DateTime(2030, 11, 24);
            int day = dt.Day;
            int month = dt.Month;
            int year = dt.Year;
            Console.WriteLine(day);//12
            Console.WriteLine(month);//3
            Console.WriteLine(year);//2024
            Console.WriteLine(day == today.Day);//true
            Console.WriteLine(dt.ToString());//2024/3/12 13:57:43
            Console.WriteLine(today.ToString());//2024 / 3 / 12 0:00:00
            Console.WriteLine(date1.ToString());


            //时间转换字符串
            //参数1 设置日期的格式
            //参数2 传入的参数
            Console.WriteLine("时间转换字符串*****************************");
            string nowStr = string.Format("{0:yyyy-MM-dd HH:mm:ss}", DateTime.Now);
            string todayStr = string.Format("{0:yyyy-MM-dd}", DateTime.Today);
            string todayStr2 = string.Format("{0:yyyy/MM/dd}", DateTime.Today);
            Console.WriteLine(nowStr);//2024-03-12 14:04:43
            Console.WriteLine(todayStr);//2024-03-12
            Console.WriteLine(todayStr2);//2024/03/12


            //字符串转换时间
            //无效格式2030:11:24
            //有效格式2030-11-24、2030/11/24
            Console.WriteLine("字符串转换时间*****************************");
            DateTime date31 = Convert.ToDateTime("2030-11-24");//string格式有要求，必须是yyyy-MM-dd hh:mm:ss
            DateTime date32 = DateTime.Parse("2030-11-24");
            Console.WriteLine(date31);//    11/24/2030 00:00:00
            Console.WriteLine(date32);//    11/24/2030 00:00:00

            //DateTime date33 = Convert.ToDateTime("2030:11:24");
            //DateTime date34 = DateTime.Parse("2030:11:24");

            DateTime date35 = Convert.ToDateTime("2030/11/24");
            DateTime date36 = DateTime.Parse("2030/11/24");
            Console.WriteLine(date35);
            Console.WriteLine(date36);



            //MaxValue,MinValue
            Console.WriteLine("MaxValue,MinValue*************************");
            DateTime date41 = DateTime.MinValue;
            DateTime date42 = DateTime.MaxValue;
            Console.WriteLine(date41);//                01/01/0001 00:00:00
            Console.WriteLine(date41.ToString());//     0001/1/1 0:00:00
            Console.WriteLine(date42);//                12/31/9999 23:59:59

        }

        [TestMethod]
        public void TestMethod6()
        {

            //两个日期的时间差
            Console.WriteLine("两个日期的时间差*****************");

            DateTime dt1 = Convert.ToDateTime("2007-8-1");
            DateTime dt2 = Convert.ToDateTime("2007-12-1");
            TimeSpan span = dt2.Subtract(dt1);
            Console.WriteLine(span.ToString());
            Console.WriteLine(span.Days);

            DateTime now = DateTime.Now;
            DateTime now1 = DateTime.Today;
            DateTime dt3 = DateTime.Parse("2023-3-10 12:30:30");
            TimeSpan span1 = now1.Subtract(dt3);
            TimeSpan span2 = now.Subtract(dt3);
            int diff1 = span1.Days;
            int diff2 = span2.Days;
            if (diff1 == diff2)
            {
                Console.WriteLine("一样！");
            }
            Console.WriteLine(span1.Days);
        }

        [TestMethod]
        public void TestMethod7()
        {
            //DateTime可以精确到 年 月 日  时  分 秒
            DateTime dt = DateTime.Now;
            Console.WriteLine("dt" + dt);
            Console.WriteLine("dt.ToString():" + dt.ToString());

            Console.WriteLine(dt.Date);
            Console.WriteLine(dt.Day);
            Console.WriteLine(dt.Month);
            Console.WriteLine(dt.Year);
            Console.WriteLine(dt.Hour);
            Console.WriteLine(dt.Minute);
            Console.WriteLine(dt.Second);
            Console.WriteLine(dt.Millisecond);

            //中文日期
            string cdt = DateTime.Now.ToLongDateString();
            Console.WriteLine(cdt);//2024年3月14日

            //星期几
            DayOfWeek weekcdt = DateTime.Now.DayOfWeek;
            Console.WriteLine(weekcdt.ToString()); //Thursday

            //计算某年某月的天数
            int days = DateTime.DaysInMonth(2007, 8);//31
            Console.WriteLine(days);

            //给日期增加一天、减少一天
            //其它年份方法类似...
            DateTime dtt = DateTime.Now;
            dtt.AddDays(1); //增加一天
            dtt.AddDays(-1);//减少一天


            //Oracle SQL里转换日期函数
            //to_date("2007-6-6", 'YYYY-MM-DD");
            //to_date("2007/6/6", 'yyyy/mm/dd");

            Console.WriteLine("--------------------------------------------");
            DateTime currentTime = DateTime.Now;
            //1.9 取中文日期显示——年月日时分
            string strY = currentTime.ToString("f"); //不显示秒
            Console.WriteLine(strY);//2024年3月14日 22:01
            //1.10 取中文日期显示_年月
            string strYM = currentTime.ToString("y");
            Console.WriteLine(strYM);//2024年3月
            //1.11 取中文日期显示_月日
            string strMD = currentTime.ToString("m");
            Console.WriteLine(strMD);// 3月14日
            //1.12 取当前年月日，格式为：2003 - 9 - 23
            string strYMD = currentTime.ToString("d");
            Console.WriteLine(strYMD);//   2024/3/14
            //1.13 取当前时分，格式为：14：24
            string strT = currentTime.ToString("t");
            Console.WriteLine(strT);  //22:01
        }
    }

    [TestClass]
    public class messageBox
    {
        [TestMethod]
        public void messageBoxTest()
        {
            Console.WriteLine("huhuhuhu");
        }
    }
}
